package models

import (
	"context"
	"fmt"
	"go.mongodb.org/mongo-driver/bson"
	"gorm.io/gorm"
	"hospital-srv/basic/inits"
	"time"
)

// mysql的数据表
type HealthData struct {
	Id              uint           `gorm:"column:id;type:bigint UNSIGNED;comment:数据Id;primaryKey;not null;" json:"id"`                                            // 数据Id
	UserId          uint           `gorm:"column:user_id;type:bigint UNSIGNED;comment:用户Id;not null;" json:"user_id"`                                             // 用户Id
	EquipmentId     uint           `gorm:"column:equipment_id;type:bigint UNSIGNED;comment:设备Id;not null;" json:"equipment_id"`                                   // 设备Id
	BodyTemperature float32        `gorm:"column:body_temperature;type:float(10, 2);comment:体温  /℃  36.1℃-37.2℃;default:NULL;" json:"body_temperature"`           // 体温  /℃  36.1℃-37.2℃
	BloodSugar      float32        `gorm:"column:blood_sugar;type:float(10, 2);comment:血糖   空腹3.9-6.1mmol/L 正常小于11.1mmol;default:NULL;" json:"blood_sugar"` // 血糖   空腹3.9-6.1mmol/L 正常小于11.1mmol
	BloodPressure   float32        `gorm:"column:blood_pressure;type:float(10, 2);comment:血压 收缩压90~140mmHg  ;default:NULL;" json:"blood_pressure"`             // 血压 收缩压90~140mmHg
	BloodPressureD  float32        `gorm:"column:blood_pressure_d;type:float(10, 2);comment:血压 舒张压60~90mmHg;default:NULL;" json:"blood_pressure_d"`            // 血压 舒张压60~90mmHg
	BloodOxygen     float32        `gorm:"column:blood_oxygen;type:float(10, 2);comment:血氧 ;default:NULL;" json:"blood_oxygen"`                                   // 血氧
	CreatedAt       time.Time      `gorm:"column:created_at;type:datetime(3);comment:创建时间;not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"`            // 创建时间
	UpdatedAt       time.Time      `gorm:"column:updated_at;type:datetime(3);comment:修改时间;not null;default:CURRENT_TIMESTAMP(3);" json:"updated_at"`            // 修改时间
	DeletedAt       gorm.DeletedAt `gorm:"column:deleted_at;type:datetime(3);comment:删除时间;default:NULL;" json:"deleted_at"`                                     // 删除时间
}

func (h *HealthData) TableName() string {
	return "health_data"
}

// 添加数据
func (h *HealthData) CreateData() error {
	return inits.DB.Create(&h).Error
}

// 某天数据
func (h *HealthData) DataList(timeDay string) (data []HealthData, err error) {
	err = inits.DB.Debug().Where("user_id = ?", h.UserId).Where("equipment_id = ?", h.EquipmentId).
		Where("created_at like  ?", "%"+timeDay+"%").Find(&data).Error
	return
}

// 获取某天的全部数据 [start, end)
func (h *HealthDatas) MongoDbGetOneDayData(date string) ([]HealthDatas, error) {
	// 1. 解析日期
	day, err := time.ParseInLocation(time.DateOnly, date, time.Local)
	if err != nil {
		return nil, fmt.Errorf("日期格式错误，期望 YYYY-MM-DD: %v", err)
	}

	// 2. 设置当天的开始和结束时间
	start := time.Date(day.Year(), day.Month(), day.Day(), 0, 0, 0, 0, time.Local)
	end := start.AddDate(0, 0, 1).Add(-time.Nanosecond) // 当天的最后一纳秒

	// 3. 转换为 UTC 时间（MongoDB 推荐使用 UTC）
	startUTC := start.UTC()
	endUTC := end.UTC()

	find, err := inits.MongoDB.Find(inits.Ctx, bson.M{
		"userId":      h.UserId,
		"equipmentId": h.EquipmentId,
		"createdAt":   bson.M{"$gte": startUTC, "$lt": endUTC},
	})

	if err != nil {
		return nil, err
	}
	var data []HealthDatas
	if err = find.All(inits.Ctx, &data); err != nil {
		return nil, err
	}
	return data, nil
}

// MongoDB的数据表
type HealthDatas struct {
	Id              uint           `bson:"id"`
	UserId          uint           `bson:"userId"`
	EquipmentId     uint           `bson:"equipmentId"`
	BodyTemperature float32        `bson:"bodyTemperature"`
	BloodSugar      float32        `bson:"bloodSugar"`
	BloodPressure   float32        `bson:"bloodPressure"`
	BloodPressureD  float32        `bson:"bloodPressureD"`
	BloodOxygen     float32        `bson:"bloodOxygen"`
	CreatedAt       time.Time      `bson:"createdAt"`
	UpdatedAt       time.Time      `bson:"updatedAt"`
	DeletedAt       gorm.DeletedAt `bson:"deletedAt"`
}

// 将mqtt数据添加到mongoDB
func (h *HealthDatas) CreateHealthDataToMongoDB() error {
	_, err := inits.MongoDB.InsertOne(context.Background(), &h)
	return err
}

// 根据用户查询健康数据
func (h *HealthData) GetUserHealthData(page, pageSize int) (HealthDataList []*HealthData, err error) {
	err = inits.DB.Where("user_id = ?", h.UserId).Scopes(Paginate(page, pageSize)).Find(&HealthDataList).Error
	return
}

func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		if page <= 0 {
			page = 1
		}

		switch {
		case pageSize > 100:
			pageSize = 100
		case pageSize <= 0:
			pageSize = 10
		}

		offset := (page - 1) * pageSize
		return db.Offset(offset).Limit(pageSize)
	}
}
